// 封装 axios
import axios from 'axios'
import store from '@/store'
import { customHistory } from './history'
// import { logout } from '@/store/actions'
import { Toast } from 'antd-mobile'
import { clearToken, getToken, setToken } from './token'

const baseURL = 'http://toutiao.itheima.net/v1_0'
const http = axios.create({
  baseURL,
  timeout: 5000,
})

// 请求拦截器
http.interceptors.request.use((config) => {
  // 获取token
  const {
    login: { token },
  } = store.getState()
  console.log(token)

  // // 除了登录请求外，其他请求统一添加 token
  if (!config.url?.startsWith('/authorizations')) {
    // 需要非空断言 去除headers中的undefind属性
    config.headers!.Authorization = `Bearer ${token}`
  }

  return config
})

// 响应拦截器
http.interceptors.response.use(undefined, async (error) => {
  // 响应失败时，会执行此处的回调函数
  if (!error.response) {
    // 网路超时请提示
    Toast.show({
      content: '网络繁忙，请稍后再试',
      duration: 1000,
    })
    return Promise.reject(error)
  }

  if (error.response.status === 401) {
    // token 过期，登录超时
    // 无感刷新token

    // try尝试捕捉错误
    try {
      const { refresh_token } = getToken()
      //判断是否含有refresh_token,无则手动返回错误
      if (!refresh_token) {
        // 无刷新token,手动返回一个promise错误
        return Promise.reject(error)
      } else {
        // 有 refresh_token，就用 refresh_token 换取新的 token
        // 注意：
        // 1 此处需要使用 axios 发请求  ---------------------------
        // 2 使用axios发请求,所以必须指定完整的路径
        const res = await axios.put(`${baseURL}/authorizations`, null, {
          headers: {
            Authorization: `Bearer ${refresh_token}`,
          },
        })

        // 进行拼接token,更新无感替换本地与redux得到的token
        const tokens = {
          // token是接口返回最新的
          token: res.data.data.token,
          // 接口没有返回新值,所以使用旧值传输
          refresh_token,
        }
        // 本地储存
        setToken(tokens)

        // 改变替换redux中的token
        store.dispatch({ type: 'login/getToken', payload: tokens })
      }
    } catch (e) {
      Toast.show({
        content: '登录超时，请重新登录',
        afterClose: () => {
          customHistory.push('/login', {
            from: customHistory.location.pathname,
          })
          // 触发退出 action，将 token 等清除
          // store.dispatch(logout())
        },
      })
      clearToken()
    }
  }

  return Promise.reject(error)
})

export { http }
